#include <iostream>
#include <signal.h>
#include <time.h>
#include <unistd.h>
using namespace std;



void showBlock(sigset_t *oset)
{
    int signo =1;
    for(;signo<=31;signo++)
    {
        if(sigismember(oset,signo))
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
    }
    cout<<endl;
}

int main()
{
    //用户层面上设置
    sigset_t set,oset;
    sigemptyset(&set); //清空set里的信号
    sigemptyset(&oset);
    sigaddset(&set,2); //添加2号信号

    //设置进入进程，谁调用设置谁
    sigprocmask(SIG_SETMASK,&set,&oset); //修改block位图后，set信号2号信号无反应
    int cnt=0;
    while(true)
    {
        showBlock(&oset);
        sleep(1);

        cnt++;

        if(cnt==10)
        {
            cout<<"重置block表"<<endl;
            sigprocmask(SIG_SETMASK,&oset,&set);
            showBlock(&set);
        }

    }
    return 0;
}





// void showBlock(sigset_t *oset)
// {
//     int signo = 1;
//     for (; signo <= 31; signo++)
//     {
//         if (sigismember(oset, signo)) // 判断signo是否在oset中 true ：1 false:0
//         {
//             cout << "1";
//         }
//         else
//         {
//             cout << "0";
//         }
//     }
//     cout << endl;
// }

// int main()
// {
//     // 用户层面上设置
//     sigset_t set, oset;
//     sigemptyset(&set); // 清空set
//     sigemptyset(&oset);
//     sigaddset(&set, 2); // 添加2号信号

//     // 设置进入进程，谁调用设置谁
//     sigprocmask(SIG_SETMASK, &set, &oset); // 改变block表,现在就是用oset的表
//     while (true)
//     {
//         showBlock(&oset);
//         sleep(1);
//     }

//     return 0;
// }